package com.wenlin.myproduction.util;

import android.animation.ValueAnimator;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Shader;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.CountDownTimer;
import android.os.Environment;
import android.os.Handler;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.DialogFragment;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;
import com.wenlin.myproduction.MyApplication;
import com.wenlin.myproduction.R;
import com.wenlin.myproduction.base.BaseDialogFragment;
import com.wenlin.myproduction.bean.LabelBean;
import com.wenlin.myproduction.widget.CircleProgress;
import com.wenlin.myproduction.widget.ColorProgressView;
import com.wenlin.myproduction.widget.GoldView;
import com.wenlin.myproduction.widget.HeartView;
import com.wenlin.myproduction.widget.InfoAnimView;
import com.wenlin.myproduction.widget.LabelsView;
import com.wenlin.myproduction.widget.PadMediaPlayer;
import com.wenlin.myproduction.widget.PicNumberView;
import com.wenlin.myproduction.widget.PicProgressView;
import com.wenlin.myproduction.widget.RoundBlueProgressBar;
import com.wenlin.myproduction.widget.RoundCircleGradientProgress;
import com.wenlin.myproduction.widget.RoundCircleProgress;
import com.wenlin.myproduction.widget.RoundRedProgressBar;
import com.wenlin.myproduction.widget.RoundYellowProgressBar;
import com.wenlin.myproduction.widget.RoundedImageView;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.List;

/**
 * @author 文琳
 * @time 2020/3/18 13:34
 * @desc UI更新方面，加载图片、文字相关用的工具，尽量避免空指针
 */
public class UI {

    public static void resetTargetLabel(LabelsView lv, LabelBean target) {
        if (lv != null) lv.resetTargetLabel(target);
    }

    public static void setLabels(LabelsView lv, List<LabelBean> list, int defaultShowRows, boolean canSelect) {
        setLabels(lv, list, defaultShowRows, canSelect, null);
    }

    public static void setLabels(LabelsView lv, List<LabelBean> list, int defaultShowRows, boolean canSelect, LabelsView.OnClickListener listener) {
        if (lv != null) lv.setLabels(list, defaultShowRows, canSelect, listener);
    }

    /**
     * 根据压缩比例来获取处理后的阿里云图片地址
     *
     * @param url   原地址
     * @param scale 压缩倍数，压缩倍数，>=1
     * @return 所求
     */
    public static String getNewWidthPicUrlCompareToScreenWidth(String url, float scale) {
        if (scale <= 0) scale = 1f;
        int newWidth = (int) (SystemUtil.getWindowWidthAndHeight(MyApplication.getMyApplicationContext())[0] / scale);
        return getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newWidth);
    }

    /**
     * 获取指定宽度的压缩处理后的阿里云图片地址
     *
     * @param url      原地址
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     * @return 所求
     */
    public static String getNewWidthPicUrlCompareToScreenWidth(String url, int newWidth, int newHeight) {
        if (Checker.isUrl(url))
            return url + "?x-oss-process=image/resize,m_mfit,h_" + newHeight + ",w_" + newWidth;
        else return url;
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void load(Context context, String url, View view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_250)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void load(Context context, String url, View view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_250)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void load(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            load(context, url, view, view.getWidth(), view.getHeight());
        else
            load(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void load_without_placeholder(Context context, String url, View view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void load_without_placeholder(Context context, String url, View view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void load_without_placeholder(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            load_without_placeholder(context, url, view, view.getWidth(), view.getHeight());
        else
            load_without_placeholder(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void load800_1200(Context context, String url, View view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_800_1200)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void load800_1200(Context context, String url, View view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_800_1200)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void load800_1200(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            load800_1200(context, url, view, view.getWidth(), view.getHeight());
        else
            load800_1200(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void load800_1000(Context context, String url, View view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_800_1000)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void load800_1000(Context context, String url, View view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_800_1000)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void load800_1000(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            load800_1000(context, url, view, view.getWidth(), view.getHeight());
        else
            load800_1000(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void load800(Context context, String url, View view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_800)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void load800(Context context, String url, View view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_800)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void load800(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            load800(context, url, view, view.getWidth(), view.getHeight());
        else
            load800(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void load800White(Context context, String url, View view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_800_1000_white)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void load800White(Context context, String url, View view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_800_1000_white)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void load800White(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            load800White(context, url, view, view.getWidth(), view.getHeight());
        else
            load800White(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void loadRoundedImageView900_1400(Context context, String url, RoundedImageView view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_900_1400)
                    .error(R.mipmap.ic_image_error)
                    .into(view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void loadRoundedImageView900_1400(Context context, String url, RoundedImageView view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_900_1400)
                    .error(R.mipmap.ic_image_error)
                    .into(view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void loadRoundedImageView900_1400(Context context, String url, RoundedImageView view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadRoundedImageView900_1400(context, url, view, view.getWidth(), view.getHeight());
        else
            loadRoundedImageView900_1400(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void load900_1400(Context context, String url, ImageView view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_900_1400)
                    .error(R.mipmap.ic_image_error)
                    .into(view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void load900_1400(Context context, String url, ImageView view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_900_1400)
                    .error(R.mipmap.ic_image_error)
                    .into(view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void load900_1400(Context context, String url, ImageView view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            load900_1400(context, url, view, view.getWidth(), view.getHeight());
        else
            load900_1400(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void loadRoundedImageView800_1000(Context context, String url, RoundedImageView view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_800_1000)
                    .error(R.mipmap.ic_image_error)
                    .into(view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void loadRoundedImageView800_1000(Context context, String url, RoundedImageView view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_800_1000)
                    .error(R.mipmap.ic_image_error)
                    .into(view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void loadRoundedImageView800_1000(Context context, String url, RoundedImageView view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadRoundedImageView800_1000(context, url, view, view.getWidth(), view.getHeight());
        else
            loadRoundedImageView800_1000(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void loadRoundedImageView174_200(Context context, String url, RoundedImageView view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_174_200)
                    .error(R.mipmap.ic_image_error)
                    .into(view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void loadRoundedImageView174_200(Context context, String url, RoundedImageView view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_174_200)
                    .error(R.mipmap.ic_image_error)
                    .into(view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void loadRoundedImageView174_200(Context context, String url, RoundedImageView view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadRoundedImageView174_200(context, url, view, view.getWidth(), view.getHeight());
        else
            loadRoundedImageView174_200(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void loadGiftBig(Context context, String url, View view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.me_ic_gift_default)//占位图太大
                    .error(R.mipmap.me_ic_gift_default)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.me_ic_gift_default);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void loadGiftBig(Context context, String url, View view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.me_ic_gift_default)//占位图太大
                    .error(R.mipmap.me_ic_gift_default)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.me_ic_gift_default);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void loadGiftBig(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadGiftBig(context, url, view, view.getWidth(), view.getHeight());
        else
            loadGiftBig(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void loadGiftSmall(Context context, String url, View view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.me_ic_gift_default_small)//占位图太大
                    .error(R.mipmap.me_ic_gift_default_small)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.me_ic_gift_default_small);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void loadGiftSmall(Context context, String url, View view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.me_ic_gift_default_small)//占位图太大
                    .error(R.mipmap.me_ic_gift_default_small)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.me_ic_gift_default_small);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void loadGiftSmall(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadGiftSmall(context, url, view, view.getWidth(), view.getHeight());
        else
            loadGiftSmall(context, url, view, 1f);
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     * @param scale   压缩比例，值越大，图片越模糊
     */
    public static void loadGiftLongBanner(Context context, String url, View view, float scale) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.me_bg_super_reward_placeholder)//占位图太大
                    .error(R.mipmap.me_bg_super_reward_placeholder)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.me_bg_super_reward_placeholder);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context  上下文
     * @param url      地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void loadGiftLongBanner(Context context, String url, View view, int newWidth, int newHeight) {//压缩倍数，>=1
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newHeight);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.me_bg_super_reward_placeholder)//占位图太大
                    .error(R.mipmap.me_bg_super_reward_placeholder)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.me_bg_super_reward_placeholder);
        }
    }

    /**
     * 加载指定宽度的图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void loadGiftLongBanner(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadGiftLongBanner(context, url, view, view.getWidth(), view.getHeight());
        else
            loadGiftLongBanner(context, url, view, 1f);
    }

    /**
     * 加载方形图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void loadSquare(Context context, String url, View view, float scale) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_250)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载方形图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void loadSquare(Context context, String url, View view, int newWidth) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newWidth);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_250)
                    .error(R.mipmap.ic_image_error)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    public static void loadSquare(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadSquare(context, url, view, view.getWidth());
        else
            loadSquare(context, url, view, 1f);
    }

    /**
     * 加载方形图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void loadSquare336(Context context, String url, RoundedImageView view, float scale) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_336)
                    .error(R.mipmap.ic_image_error)
                    .into(view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    /**
     * 加载方形图片
     *
     * @param context 上下文
     * @param url     地址
     * @param view    控件
     */
    public static void loadSquare336(Context context, String url, RoundedImageView view, int newWidth) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newWidth);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_loading_336)
                    .error(R.mipmap.ic_image_error)
                    .into(view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_image_error);
        }
    }

    public static void loadSquare336(Context context, String url, RoundedImageView view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadSquare336(context, url, view, view.getWidth());
        else
            loadSquare336(context, url, view, 1f);
    }

    /**
     * 加载头像
     *
     * @param context 上下文
     * @param url     图片地址
     * @param view    控件
     * @param scale   压缩比例
     */
    public static void loadAvatar(Context context, String url, View view, float scale) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.isPic(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_default_head_girl)
                    .error(R.mipmap.ic_default_head_girl)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_default_head_girl);
        }
    }

    /**
     * 加载头像
     *
     * @param context  上下文
     * @param url      图片地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void loadAvatar(Context context, String url, View view, int newWidth) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.isPic(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newWidth);
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_default_head_girl)
                    .error(R.mipmap.ic_default_head_girl)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_default_head_girl);
        }
    }

    /**
     * 加载头像
     *
     * @param context 上下文
     * @param url     图片地址
     * @param view    控件
     */
    public static void loadAvatar(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadAvatar(context, url, view, view.getWidth());
        else
            loadAvatar(context, url, view, 1f);
    }

    /**
     * 加载PK游戏相关的头像
     *
     * @param context 上下文
     * @param url     图片地址
     * @param view    控件
     * @param scale   压缩比例
     */
    public static void loadGameCompetitorAvatar(Context context, String url, View view, float scale) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        int resourceId = url.equals(ValCommon.BOY) ? R.mipmap.ic_person_info_sex_boy : R.mipmap.ic_person_info_sex_girl;
        if (Checker.isPic(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .apply(RequestOptions.bitmapTransform(new CircleCrop()))
                    .placeholder(resourceId)
                    .error(resourceId)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(resourceId);
        }
    }

    /**
     * 加载PK游戏相关的头像
     *
     * @param context  上下文
     * @param url      图片地址
     * @param view     控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void loadGameCompetitorAvatar(Context context, String url, View view, int newWidth) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        int resourceId = url.equals(ValCommon.BOY) ? R.mipmap.ic_person_info_sex_boy : R.mipmap.ic_person_info_sex_girl;
        if (Checker.isPic(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newWidth);
            Glide.with(context)
                    .load(url)
                    .apply(RequestOptions.bitmapTransform(new CircleCrop()))
                    .placeholder(resourceId)
                    .error(resourceId)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(resourceId);
        }
    }

    /**
     * 加载PK游戏相关的头像
     *
     * @param context 上下文
     * @param url     图片地址
     * @param view    控件
     */
    public static void loadGameCompetitorAvatar(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadGameCompetitorAvatar(context, url, view, view.getWidth());
        else
            loadGameCompetitorAvatar(context, url, view, 1f);
    }

    //音频封面
    public static void loadAudioCover(Context context, String url, View view) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.hasWord(url)) {
            Glide.with(context)
                    .load(url)
                    .placeholder(R.mipmap.ic_default_audio_cover)
                    .error(R.mipmap.ic_default_audio_cover)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_default_audio_cover);
        }
    }

    /**
     * 加载圆形头像
     *
     * @param context 上下文
     * @param url     图片地址
     * @param view    图片控件
     */
    public static void loadCircleAvatar(Context context, String url, View view, float scale) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.isPic(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, scale);
            Glide.with(context)
                    .load(url)
                    .apply(RequestOptions.bitmapTransform(new CircleCrop()))
                    .placeholder(R.mipmap.ic_default_head_girl)
                    .error(R.mipmap.ic_default_head_girl)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_default_head_girl);
        }
    }

    /**
     * 加载圆形头像
     *
     * @param context  上下文
     * @param url      图片地址
     * @param view     图片控件
     * @param newWidth 显示的大小，以宽度为准，高度自动适配
     */
    public static void loadCircleAvatar(Context context, String url, View view, int newWidth) {
        if (Checker.isNull(context) || Checker.isNull(view)) return;
        if (Checker.isPic(url)) {
            url = getNewWidthPicUrlCompareToScreenWidth(url, newWidth, newWidth);
            Glide.with(context)
                    .load(url)
                    .apply(RequestOptions.bitmapTransform(new CircleCrop()))
                    .placeholder(R.mipmap.ic_default_head_girl)
                    .error(R.mipmap.ic_default_head_girl)
                    .into((ImageView) view);
        } else {
            ((ImageView) view).setImageResource(R.mipmap.ic_default_head_girl);
        }
    }

    /**
     * 加载圆形头像图片
     *
     * @param context 上下文
     * @param url     图片地址
     * @param view    控件
     */
    public static void loadCircleAvatar(Context context, String url, View view) {
        if (Checker.isNull(view)) return;
        if (view.getWidth() > 0)
            loadCircleAvatar(context, url, view, view.getWidth());
        else
            loadCircleAvatar(context, url, view, 1f);
    }

    /**
     * 加载10px的圆角图片
     *
     * @param context 上下文
     * @param url     图片编号
     * @param iv      图片控件
     */
    public static void loadRoundCorner10Radius(Context context, String url, ImageView iv) {
        if (Checker.hasNoWord(url)) return;
        if (Checker.isNull(iv)) return;
        if (iv.getWidth() > 0)
            url = getNewWidthPicUrlCompareToScreenWidth(url, iv.getWidth(), iv.getHeight());
        else
            url = getNewWidthPicUrlCompareToScreenWidth(url, 1f);
        Glide.with(context)
                .load(url)
                .transform(new RoundedCorners(10))
                .error(R.mipmap.ic_home_cover_default).into(iv);
    }

    /**
     * 加载10px的圆角图片
     *
     * @param context 上下文
     * @param resId   图片编号
     * @param iv      图片控件
     */
    public static void loadRoundCorner10Radius(Context context, int resId, ImageView iv) {
        Glide.with(context)
                .load(resId)
                .transform(new RoundedCorners(10))
                .error(R.mipmap.ic_home_cover_default).into(iv);
    }

    /**
     * 加载10px的圆角图片
     *
     * @param context 上下文
     * @param url     图片编号
     * @param iv      图片控件
     */
    public static void loadRoundCorner15Radius(Context context, String url, ImageView iv) {
        if (Checker.hasNoWord(url)) return;
        if (Checker.isNull(iv)) return;
        if (iv.getWidth() > 0)
            url = getNewWidthPicUrlCompareToScreenWidth(url, iv.getWidth(), iv.getHeight());
        else
            url = getNewWidthPicUrlCompareToScreenWidth(url, 1f);
        Glide.with(context)
                .load(url)
                .transform(new RoundedCorners(15))
                .error(R.mipmap.ic_home_cover_default).into(iv);
    }

    /**
     * 加载10px的圆角图片
     *
     * @param context 上下文
     * @param url     图片编号
     * @param iv      图片控件
     */
    public static void loadRoundCorner20Radius(Context context, String url, ImageView iv) {
        if (Checker.hasNoWord(url)) return;
        if (Checker.isNull(iv)) return;
        if (iv.getWidth() > 0)
            url = getNewWidthPicUrlCompareToScreenWidth(url, iv.getWidth(), iv.getHeight());
        else
            url = getNewWidthPicUrlCompareToScreenWidth(url, 1f);
        Glide.with(context)
                .load(url)
                .transform(new RoundedCorners(20))
                .error(R.mipmap.ic_home_cover_default).into(iv);
    }

    /**
     * 加载40px的圆角图片
     *
     * @param context 上下文
     * @param url     图片编号
     * @param iv      图片控件
     */
    public static void loadRoundCorner46Radius(Context context, String url, ImageView iv) {
        if (Checker.hasNoWord(url)) return;
        if (Checker.isNull(iv)) return;
        if (iv.getWidth() > 0)
            url = getNewWidthPicUrlCompareToScreenWidth(url, iv.getWidth(), iv.getHeight());
        else
            url = getNewWidthPicUrlCompareToScreenWidth(url, 1f);
        Glide.with(context)
                .load(url)
                .transform(new RoundedCorners(44))
                .error(R.mipmap.ic_image_error).into(iv);
    }

    /**
     * 加载50px的圆角图片
     *
     * @param context 上下文
     * @param url     图片编号
     * @param iv      图片控件
     */
    public static void loadRoundCorner49Radius(Context context, String url, ImageView iv) {
        if (Checker.hasNoWord(url)) return;
        if (Checker.isNull(iv)) return;
        if (iv.getWidth() > 0)
            url = getNewWidthPicUrlCompareToScreenWidth(url, iv.getWidth(), iv.getHeight());
        else
            url = getNewWidthPicUrlCompareToScreenWidth(url, 1f);
        Glide.with(context)
                .load(url)
                .transform(new RoundedCorners((int) MyApplication.getMyApplicationContext().getResources().getDimensionPixelSize(R.dimen.px48)))
                .error(R.mipmap.ic_image_error).into(iv);
    }

    /**
     * 设置变色文本，灰色+橙色
     *
     * @param activity 上下文
     * @param tv       文本控件
     * @param strings  文本数组
     */
    public static void setSpanTextGreenWithActivity(Activity activity, TextView tv, String... strings) {
        setSpanTextGreen(activity, tv, strings);
    }

    /**
     * 设置黑灰色和绿色混排的文字
     *
     * @param context 上下文
     * @param tv      文本控件
     * @param strings 字符串们
     */
    public static void setSpanTextGreen(Context context, TextView tv, String... strings) {
        if (Checker.isNull(context) || Checker.isNull(tv)) return;
        if (Checker.isNull(strings) || strings.length == 0) return;
        SpanUtils spanUtils = new SpanUtils();
        for (int i = 0; i < strings.length; i++) {
            if (i % 2 == 0) {
                if (Checker.hasWord(strings[i]))
                    spanUtils.append(strings[i]).setForegroundColor(ContextCompat.getColor(context, R.color.text_333));
            } else {
                if (Checker.hasWord(strings[i]))
                    spanUtils.append(strings[i]).setForegroundColor(ContextCompat.getColor(context, R.color.bg_main));
            }
        }
        tv.setText(spanUtils.create());
    }

    /**
     * 设置蓝绿渐变色文字
     *
     * @param textView 文字控件
     */
    public static void setSpanGradientBlueGreen(TextView textView) {
        float endX = textView.getPaint().getTextSize() * textView.getText().length();
        LinearGradient linearGradient = new LinearGradient(0f, 0f, endX, 0f,
                Color.parseColor("#ff1dc8e4"),
                Color.parseColor("#ff1de6ba"),
                Shader.TileMode.CLAMP
        );
        textView.getPaint().setShader(linearGradient);
        textView.invalidate();
    }

    /**
     * 取消蓝绿渐变色文字
     *
     * @param textView 文字控件
     */
    public static void cancelSpanGradientBlueGreen(TextView textView) {
        textView.getPaint().setShader(null);
        textView.invalidate();
    }

    /**
     * 设置文字大小相错文本
     *
     * @param activity 上下文
     * @param tv       文本控件
     * @param strings  文本数组
     */
    public static void setSpanTextBigSmall(Activity activity, TextView tv, String... strings) {
        setSpanTextBigSmall(activity, tv, strings);
    }

    /**
     * 设置文字大小相错文本
     *
     * @param context 上下文
     * @param tv      文本控件
     * @param strings 文本数组
     */
    public static void setSpanTextBigSmall(Context context, TextView tv, String... strings) {
        if (Checker.isNull(context) || Checker.isNull(tv)) return;
        if (Checker.isNull(strings) || strings.length == 0) return;
        SpanUtils spanUtils = new SpanUtils();
        for (int i = 0; i < strings.length; i++) {
            if (i % 2 == 0) {
                if (Checker.hasWord(strings[i]))
                    spanUtils.append(strings[i]).setFontSize((int) getPx(R.dimen.wpx50)).setBold();
            } else {
                if (Checker.hasWord(strings[i]))
                    spanUtils.append(strings[i]).setFontSize((int) getPx(R.dimen.wpx22));
            }
        }
        tv.setText(spanUtils.create());
    }

    /**
     * 为文本控件设置大数字小单位
     *
     * @param tv  文本控件
     * @param str 文本
     */
    public static void setTextWith50BigNumber25SmallUnit(TextView tv, String str) {
        if (Checker.isNull(tv)) return;
        if (Checker.hasNoWord(str)) return;
        String numStr = "0123456789.-+/*%";
        SpanUtils spanUtils = new SpanUtils();
        for (int i = 0; i < str.length(); i++) {
            String s = String.valueOf(str.charAt(i));
            if (numStr.contains(s)) {
                spanUtils.append(s).setFontSize((int) getPx(R.dimen.wpx50)).setBold();
            } else {
                spanUtils.append(s).setFontSize((int) getPx(R.dimen.wpx25));
            }
        }
        tv.setText(spanUtils.create());
    }

    /**
     * 为文本控件设置大数字小单位
     *
     * @param tv  文本控件
     * @param str 文本
     */
    public static void setTextWith60BigNumber40SmallUnit(TextView tv, String str) {
        if (Checker.isNull(tv)) return;
        if (Checker.hasNoWord(str)) return;
        String numStr = "0123456789.-+/*%";
        SpanUtils spanUtils = new SpanUtils();
        for (int i = 0; i < str.length(); i++) {
            String s = String.valueOf(str.charAt(i));
            if (numStr.contains(s)) {
                spanUtils.append(s).setFontSize((int) getPx(R.dimen.wpx60)).setBold();
            } else {
                spanUtils.append(s).setFontSize((int) getPx(R.dimen.wpx40));
            }
        }
        tv.setText(spanUtils.create());
    }

    /**
     * 为文本控件设置大数字小单位
     *
     * @param tv  文本控件
     * @param str 文本
     */
    public static void setTextWith50BigNumber22SmallUnit(TextView tv, String str) {
        if (Checker.isNull(tv)) return;
        if (Checker.hasNoWord(str)) return;
        String numStr = "0123456789.-+/*%";
        SpanUtils spanUtils = new SpanUtils();
        for (int i = 0; i < str.length(); i++) {
            String s = String.valueOf(str.charAt(i));
            if (numStr.contains(s)) {
                spanUtils.append(s).setFontSize((int) getPx(R.dimen.wpx50)).setBold();
            } else {
                spanUtils.append(s).setFontSize((int) getPx(R.dimen.wpx22));
            }
        }
        tv.setText(spanUtils.create());
    }

    /**
     * 为文本控件设置大数字小单位
     *
     * @param tv  文本控件
     * @param str 文本
     */
    public static void setTextWith79BigNumber34SmallUnit(TextView tv, String str) {
        if (Checker.isNull(tv)) return;
        if (Checker.hasNoWord(str)) return;
        String numStr = "0123456789.-+/*%";
        SpanUtils spanUtils = new SpanUtils();
        for (int i = 0; i < str.length(); i++) {
            String s = String.valueOf(str.charAt(i));
            if (numStr.contains(s)) {
                spanUtils.append(s).setFontSize((int) getPx(R.dimen.wpx79)).setBold();
            } else {
                spanUtils.append(s).setFontSize((int) getPx(R.dimen.wpx34));
            }
        }
        tv.setText(spanUtils.create());
    }

    /**
     * 为文本控件设置文字，text可以为空字符串（""），统一用这个方法，避免空指针异常
     *
     * @param tv   文本控件
     * @param text 显示的字符串，字符串为null时，控件不显示内容
     */
    public static void setText(TextView tv, String text) {
        if (Checker.isNull(text)) text = "";
        if (Checker.notNull(tv))
            tv.setText(text);
    }

    /**
     * 设置文本
     *
     * @param tv  文本控件
     * @param num 数值
     */
    public static void setText(TextView tv, int num) {
        setText(tv, String.valueOf(num));
    }

    /**
     * 设置文本
     *
     * @param tv  文本控件
     * @param num 数值
     */
    public static void setText(TextView tv, long num) {
        setText(tv, String.valueOf(num));
    }

    /**
     * 设置文本
     *
     * @param tv  文本控件
     * @param num 数值
     */
    public static void setText(TextView tv, double num) {
        setText(tv, String.valueOf(num));
    }

    /**
     * 设置文本
     *
     * @param tv  文本控件
     * @param num 数值
     */
    public static void setText(TextView tv, float num) {
        setText(tv, String.valueOf(num));
    }

    /**
     * 设置文本
     *
     * @param tv  文本控件
     * @param num 数值
     */
    public static void setText(TextView tv, short num) {
        setText(tv, String.valueOf(num));
    }

    /**
     * 设置文本
     *
     * @param tv  文本控件
     * @param num 数值
     */
    public static void setText(TextView tv, byte num) {
        setText(tv, String.valueOf(num));
    }

    /**
     * 设置文本字体大小
     *
     * @param tv   文本控件
     * @param size 字体大小
     */
    public static void setTextSize(TextView tv, float size) {
        if (Checker.isNull(tv)) return;
        tv.setTextSize(size);
    }

    /**
     * 设置输入框的光标位置
     *
     * @param et    输入框
     * @param index 光标目标位置
     */
    public static void setSelection(EditText et, int index) {
        if (Checker.isNull(et)) return;
        et.setSelection(index);
    }

    /**
     * 设置文字颜色
     *
     * @param tv      控件
     * @param colorId 颜色编号
     */
    public static void setTextColor(TextView tv, int colorId) {
        if (Checker.isNull(tv) || colorId <= 0) return;
        if (Checker.isNull(MyApplication.getMyApplicationContext())) return;
        tv.setTextColor(ContextCompat.getColor(MyApplication.getMyApplicationContext(), colorId));
    }

    /**
     * 设置可用不可用
     *
     * @param view   控件
     * @param enable 可用否
     */
    public static void setEnabled(View view, boolean enable) {
        if (Checker.isNull(view)) return;
        view.setEnabled(enable);
    }

    /**
     * 设置背景样式资源
     *
     * @param view  控件
     * @param resId 资源编号
     */
    public static void setBackgroundResource(View view, int resId) {
        if (Checker.isNull(view)) return;
        view.setBackgroundResource(resId);
    }

    /**
     * 设置背景样式颜色
     *
     * @param view  控件
     * @param resId 资源编号
     */
    public static void setBackgroundColor(View view, @ColorRes int resId) {
        if (Checker.isNull(view)) return;
        view.setBackgroundColor(ContextCompat.getColor(MyApplication.getMyApplicationContext(), resId));
    }

    /**
     * 设置控件是否可被点击
     *
     * @param view      控件
     * @param clickable 是否可被点击
     */
    public static void setClickable(View view, boolean clickable) {
        if (Checker.isNull(view)) return;
        view.setClickable(clickable);
    }

    /**
     * 设置显示或隐藏
     *
     * @param view       控件
     * @param visibility 显隐的类型编码，0-显示,4-隐藏,8-消失
     */
    public static void setVisibility(View view, int visibility) {
        if (Checker.isNull(view)) return;
        if (view.getVisibility() != visibility)
            view.setVisibility(visibility);
    }

    /**
     * 返回控件是否可见
     *
     * @param view 控件
     * @return 所求
     */
    public static boolean isVisible(View view) {
        if (Checker.isNull(view)) return false;
        return view.getVisibility() == View.VISIBLE;
    }

    /**
     * 返回控件是否不可见
     *
     * @param view 控件
     * @return 所求
     */
    public static boolean isInvisible(View view) {
        if (Checker.isNull(view)) return false;
        return view.getVisibility() == View.INVISIBLE;
    }

    /**
     * 返回控件是否消失不见
     *
     * @param view 控件
     * @return 所求
     */
    public static boolean isGone(View view) {
        if (Checker.isNull(view)) return false;
        return view.getVisibility() == View.GONE;
    }

    public static void setGone(View... views) {
        for (View view : views) {
            setVisibility(view, View.GONE);
        }
    }

    public static void setGone(View view) {
        setVisibility(view, View.GONE);
    }

//    public static void setInvisible(View view) {
//        setVisibility(view, View.INVISIBLE);
//    }

    public static void setInvisible(View... views) {
        for (View view : views) {
            setVisibility(view, View.INVISIBLE);
        }
    }

//    public static void setVisible(View view) {
//        setVisibility(view, View.VISIBLE);
//    }

    public static void setVisible(View... views) {
        for (View view : views) {
            setVisibility(view, View.VISIBLE);
        }
    }

    public static void setVisibleInvisible(boolean visible, View... views) {
        for (View view :
                views) {
            setVisibleInvisible(view, visible);
        }
    }

    public static void setVisibleGone(boolean visible, View... views) {
        for (View view :
                views) {
            setVisibleGone(view, visible);
        }
    }

    public static void setVisibleInvisible(View view, boolean visible) {
        setVisibility(view, visible ? View.VISIBLE : View.INVISIBLE);
    }

    public static void setVisibleGone(View view, boolean visible) {
        setVisibility(view, visible ? View.VISIBLE : View.GONE);
    }

    /**
     * 设置点击事件
     *
     * @param view     控件
     * @param listener 点击事件监听
     */
    public static void setOnClickListener(View view, View.OnClickListener listener) {
        if (Checker.isNull(view)) return;
        if (Checker.isNull(listener)) return;
        view.setOnClickListener(listener);
    }

    /**
     * 设置长按点击事件
     *
     * @param view
     * @param listener
     */
    public static void setOnLongClickListener(View view, View.OnLongClickListener listener) {
        if (Checker.isNull(view)) return;
        if (Checker.isNull(listener)) return;
        view.setOnLongClickListener(listener);
    }

    /**
     * 设置控件显示本地图片
     *
     * @param view  图片控件
     * @param resId 本地图片的资源编号
     */
    public static void setImageResource(ImageView view, int resId) {
        if (Checker.isNull(view)) return;
        view.setImageResource(resId);
    }

    /**
     * 设置控件显示本地图片
     *
     * @param view   图片控件
     * @param bitmap 本地图片的资源
     */
    public static void setImageBitmap(ImageView view, Bitmap bitmap) {
        if (Checker.isNull(view)) return;
        view.setImageBitmap(bitmap);
    }

    /**
     * 为进度条控件设置进度——黄色
     *
     * @param progressBar 进度条控件
     * @param progress    进度
     */
    public static void setProgress(RoundYellowProgressBar progressBar, int progress) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setProgress(progress);
    }

    /**
     * 为进度条控件设置进度——蓝色
     *
     * @param progressBar 进度条控件
     * @param progress    进度
     */
    public static void setProgress(RoundBlueProgressBar progressBar, int progress) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setProgress(progress);
    }

    /**
     * 为进度条控件设置进度——绿色
     *
     * @param progressSmile 进度条控件
     * @param progressSad   进度条控件
     * @param progress      进度
     */
    public static void setProgress(PicProgressView progressSmile, PicProgressView progressSad, int progress) {
        if (Checker.notNull(progressSmile)) progressSmile.setProgress(progress);
        if (Checker.notNull(progressSad)) progressSad.setProgress(100 - progress);
    }

    /**
     * 设置爱心进度
     *
     * @param hv       爱心控件
     * @param progress 百分比
     */
    public static void setHeartProgress(HeartView hv, int progress) {
        if (hv != null) hv.setProgress(progress);
    }

    /**
     * 为进度条控件设置进度——红色
     *
     * @param progressBar 进度条控件
     * @param progress    进度
     */
    public static void setProgress(RoundRedProgressBar progressBar, int progress) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setProgress(progress);
    }

    /**
     * 为进度条控件设置进度——红色
     *
     * @param progressBar 进度条控件
     * @param progress    进度
     */
    public static void setProgress(ColorProgressView progressBar, int progress) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setProgress(progress);
    }

    /**
     * 为进度条控件设置进度
     *
     * @param progressBar 进度条控件
     */
    public static void startShowAnimate(RoundYellowProgressBar progressBar) {
        if (Checker.isNull(progressBar)) return;
        progressBar.startShowAnimate();
    }


    /**
     * 为进度条控件设置进度
     *
     * @param progressBar 进度条控件
     */
    public static void startShowAnimate(RoundBlueProgressBar progressBar) {
        if (Checker.isNull(progressBar)) return;
        progressBar.startShowAnimate();
    }

    /**
     * 为进度条控件设置进度
     *
     * @param progressBar 进度条控件
     */
    public static void startShowAnimate(RoundRedProgressBar progressBar) {
        if (Checker.isNull(progressBar)) return;
        progressBar.startShowAnimate();
    }

    /**
     * 为进度条控件设置进度
     *
     * @param progressBar 进度条控件
     * @param progress    进度
     */
    public static void setProgress(CircleProgress progressBar, int progress) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setProgress(progress);
    }

    /**
     * 为进度条控件设置进度
     *
     * @param progressBar 进度条控件
     * @param progressMax 进度最大值
     */
    public static void setProgressMax(ProgressBar progressBar, int progressMax) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setMax(progressMax);
    }

    /**
     * 为进度条控件设置进度
     *
     * @param progressBar 进度条控件
     * @param progress    进度
     */
    public static void setProgress(ProgressBar progressBar, int progress) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setProgress(progress);
    }

    /**
     * 为进度条控件设置进度
     *
     * @param progressBar 进度条控件
     * @param progress    进度
     */
    public static void setProgress(RoundCircleProgress progressBar, int progress) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setProgress(progress);
    }

    /**
     * 为进度条控件设置进度
     *
     * @param progressBar 进度条控件
     * @param progress    进度
     */
    public static void setProgress(RoundCircleGradientProgress progressBar, int progress) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setProgress(progress);
    }

    /**
     * 为进度条控件设置进度
     *
     * @param progressBar 进度条控件
     * @param progressMax 进度最大值
     */
    public static void setProgressMax(CircleProgress progressBar, int progressMax) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setMax(progressMax);
    }

    /**
     * 为进度条控件设置进度
     *
     * @param progressBar 进度条控件
     * @param progressMax 进度最大值
     */
    public static void setProgressMax(RoundCircleProgress progressBar, int progressMax) {
        if (Checker.isNull(progressBar)) return;
        progressBar.setMax(progressMax);
    }

    /**
     * 隐藏弹窗
     *
     * @param activity 上下文
     * @param dialog   弹窗
     */
    public static void hide(Activity activity, BaseDialogFragment dialog) {
        if (Checker.isNull(activity) || activity.isFinishing() || Checker.isNull(dialog)) return;
        dialog.hide();
    }

    /**
     * 隐藏并销毁弹窗
     *
     * @param activity 上下文
     * @param dialog   弹窗
     */
    public static void hideAndRelease(Activity activity, BaseDialogFragment dialog) {
        if (Checker.isNull(activity) || activity.isFinishing() || Checker.isNull(dialog)) return;
        dialog.hide();
        dialog = null;
    }

    /**
     * 隐藏并销毁弹窗
     *
     * @param activity 上下文
     * @param dialog   弹窗
     */
    public static void hideAndRelease(Activity activity, Dialog dialog) {
        if (Checker.isNull(activity) || activity.isFinishing() || Checker.isNull(dialog)) return;
        dialog.dismiss();
        dialog = null;
    }

    /**
     * 释放倒计时
     *
     * @param timer 倒计时
     */
    public static void releaseTimer(CountDownTimer timer) {
        if (Checker.notNull(timer)) {
            timer.cancel();
            timer = null;
        }
    }

    /**
     * 释放值动画
     *
     * @param valueAnimator 值动画执行者
     */
    public static void releaseValueAnimator(ValueAnimator valueAnimator) {
        if (valueAnimator != null) {
            valueAnimator.cancel();
            valueAnimator.removeAllUpdateListeners();
            valueAnimator.removeAllListeners();
            valueAnimator = null;
        }
    }

    /**
     * 释放平板影音播放器
     *
     * @param padMediaPlayer 平板影音播放器
     */
    public static void releasePadMediaPlayer(PadMediaPlayer padMediaPlayer) {
        if (Checker.notNull(padMediaPlayer)) {
            if (padMediaPlayer.isPlaying())
                padMediaPlayer.pause();
            padMediaPlayer.release();//这句代码包括了player=null
        }
    }

    /**
     * 执行动画
     *
     * @param view 控件
     * @param anim 动画
     */
    public static void startAnimation(View view, Animation anim) {
        if (Checker.isNull(view)) return;
        view.startAnimation(anim);
    }

    /**
     * 设置控件翻转180度
     *
     * @param view 控件
     */
    public static void showClockwiseRotationAnim(View view) {
        if (Checker.isNull(view)) return;
        AnimUtil.clockwiseRotation(view);
    }

    /**
     * 设置控件翻转回最开始的状态
     *
     * @param view 控件
     */
    public static void showAnticlockwiseRotationAnim(View view) {
        if (Checker.isNull(view)) return;
        AnimUtil.anticlockwiseRotation(view);
    }

//    /**
//     * 曲线图设置数据并刷新
//     *
//     * @param curveView 曲线图控件
//     * @param list      数据
//     */
//    public static void setCurveDataAndRefresh(CurveView curveView, List<CurveView.InfoEn> list) {
//        if (Checker.isNull(curveView)) return;
//        curveView.setListData(list);
//        curveView.startAnimation();
//    }

    /**
     * 保存错误信息到文件中
     *
     * @param msg 出错信息
     */
    public static void saveErrorInfo2File(String msg) {
        try {
            StringBuilder sb = new StringBuilder();
            String time = TimeUtil.getTodayFormatYYYYMMDD();
            sb.append(time).append(":\n").append(msg).append("\n");
            String fileName = "MyEnglishErrorToast.log";
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                String path = Environment.getExternalStorageDirectory().getPath() + "/0toast/";
                File dir = new File(path);
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                BufferedWriter out = null;
                try {
                    //FileOutputStream(file, true),第二个参数为true是追加内容，false是覆盖
                    out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path + fileName, true)));
                    out.newLine();//换行
                    out.write(sb.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (out != null) {
                            out.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        } catch (Exception e) {
            Log.e("MyEnglish", "an error occured while writing file...", e);
        }
    }

    /**
     * 设置tag标记
     *
     * @param view 控件
     * @param obj  标记
     */
    public static void setTag(View view, Object obj) {
        if (Checker.isNull(view)) return;
        view.setTag(obj);
    }

    /**
     * 获取tag标记
     *
     * @param view 控件
     * @return 所求
     */
    public static Object getTag(View view) {
        Object tag = null;
        if (Checker.notNull(view))
            tag = view.getTag();
        return tag;
    }

    /**
     * 获取输入框字符串
     *
     * @param et 输入框控件
     * @return 所求
     */
    public static String getEtText(EditText et) {
        if (Checker.isNull(et)) return "";
        return et.getText().toString().trim();
    }

    /**
     * 开始帧动画
     *
     * @param drawable 帧动画
     */
    public static void startAnimationDrawable(AnimationDrawable drawable) {
        if (Checker.isNull(drawable)) return;
        drawable.start();
    }

    /**
     * 结束帧动画
     *
     * @param drawable 帧动画
     */
    public static void stopAnimationDrawable(AnimationDrawable drawable) {
        if (Checker.isNull(drawable)) return;
        drawable.stop();
    }

    /**
     * 获取控件的字符串
     *
     * @param tv 控件
     * @return 所求
     */
    public static String getText(TextView tv) {
        if (Checker.isNull(tv)) return "";
        return tv.getText().toString();
    }

    /**
     * 滑动列表到指定位置
     *
     * @param rv    列表
     * @param index 位置
     */
    public static void scrollToPosition(RecyclerView rv, int index) {
        if (Checker.isNull(rv)) return;
        if (index < 0) index = 0;
        rv.scrollToPosition(index);
    }

    /**
     * 平滑地滑动到指定位置
     *
     * @param rv    列表
     * @param index 位置
     */
    public static void smoothScrollTo(RecyclerView rv, int index) {
        if (Checker.isNull(rv)) return;
        if (index < 0) index = 0;
        rv.smoothScrollToPosition(index);
    }

    /**
     * 释放处理器
     *
     * @param handler 处理器
     */
    public static void releaseHandler(Handler handler) {
        if (Checker.isNull(handler)) return;
        handler.removeCallbacksAndMessages(null);
        handler = null;
    }

    /**
     * 设置分数
     *
     * @param nv     分数控件
     * @param number 分数
     */
    public static void setNumber(PicNumberView nv, int number) {
        if (Checker.isNull(nv)) return;
        nv.setNumber(number);
    }

    /**
     * 设置分数，不带动画
     *
     * @param nv     分数控件
     * @param number 分数
     */
    public static void setNumberWithoutAnim(PicNumberView nv, int number) {
        if (Checker.isNull(nv)) return;
        nv.setNumberWithoutAnim(number);
    }

    /**
     * 模拟点击
     *
     * @param view 控件
     */
    public static void performClick(View view) {
        if (Checker.isNull(view)) return;
        view.performClick();
    }

    /**
     * 设置文本控件右边的图标
     *
     * @param tv    文本控件
     * @param redId 图标编号
     */
    public static void setDrawableEnd(TextView tv, int redId) {
        if (Checker.isNull(tv)) return;
        Drawable drawable = MyApplication.getMyApplicationContext().getResources().getDrawable(redId);
        drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
        tv.setCompoundDrawables(null, null, drawable, null);
    }

    /**
     * 设置信息控件信息文本
     *
     * @param view 信息控件
     * @param desc 信息文本
     */
    public static void setInfoViewDesc(InfoAnimView view, String desc) {
        if (Checker.isNull(view)) return;
        view.setDesc(desc);
    }

    /**
     * 设置信息控件的头像
     *
     * @param activity 上下文
     * @param civUrl   头像地址
     * @param view     信息控件
     */
    public static void setInfoViewCiv(Activity activity, String civUrl, InfoAnimView view) {
        if (Checker.isNull(activity)) return;
        if (Checker.isNull(view)) return;
        Glide.with(activity)
                .downloadOnly()
                .load(civUrl)
                .placeholder(R.mipmap.ic_default_head_girl)
                .error(R.mipmap.ic_default_head_girl)
                .into(new SimpleTarget<File>() {
                    @Override
                    public void onResourceReady(@NonNull File resource, @Nullable Transition<? super File> transition) {
                        view.setCivPath(resource.getAbsolutePath());
                    }
                });
    }

    /**
     * 设置金币控件显示金币
     *
     * @param gvCoin   金币控件
     * @param diamonds 金币数
     */
    public static void runTo(GoldView gvCoin, long diamonds) {
        if (Checker.isNull(gvCoin)) return;
        gvCoin.runTo(diamonds);
    }

    /**
     * 设置金币从某个数跑往另一个数
     *
     * @param gvCoin      金币控件
     * @param diamonds    金币数
     * @param oldDiamonds 旧的金币数
     */
    public static void runToFrom(GoldView gvCoin, long diamonds, int oldDiamonds) {
        if (Checker.isNull(gvCoin)) return;
        gvCoin.runToFrom(diamonds, oldDiamonds);
    }

    /**
     * @param gvCoin   金币控件
     * @param diamonds 金币数
     */
    public static void jumpTo(GoldView gvCoin, long diamonds) {
        if (Checker.isNull(gvCoin)) return;
        gvCoin.jumpTo(diamonds);
    }

    /**
     * 设置金币
     *
     * @param gvCoin   金币控件
     * @param diamonds 金币数
     * @param initGold 是否是初始化金币
     */
    public static void setGold(GoldView gvCoin, long diamonds, boolean initGold) {
        if (initGold) jumpTo(gvCoin, diamonds);
        else runTo(gvCoin, diamonds);
    }

    /**
     * 释放金币控件
     *
     * @param gv 金币控件
     */
    public static void releaseGoldView(GoldView gv) {
        if (Checker.isNull(gv)) return;
        gv.release();
    }

    /**
     * 释放分数控件
     *
     * @param nv 分数控件
     */
    public static void releaseNumberView(PicNumberView nv) {
        if (Checker.isNull(nv)) return;
        nv.release();
    }

    /**
     * 返回当前设备适配的长度
     *
     * @param dimenId dimen的编号
     * @return 所求
     */
    public static float getPx(int dimenId) {
        Context context = MyApplication.getMyApplicationContext();
        if (Checker.notNull(context) && Checker.notNull(context.getResources()))
            return context.getResources().getDimensionPixelSize(dimenId);
        else return 10;
    }

    /**
     * 设置笑脸和哭脸的百分比
     *
     * @param tvSmile      笑脸控件
     * @param tvSad        哭脸控件
     * @param smilePercent 笑脸的百分比
     */
    public static void setSmileSadPercentText(TextView tvSmile, TextView tvSad, int smilePercent) {
        setText(tvSmile, smilePercent + "%");
        setText(tvSad, 100 - smilePercent + "%");
    }

    /**
     * 返回颜色资源对应的颜色值
     *
     * @param colorId 颜色资源编号
     * @return 所求
     */
    public static int getColor(int colorId) {
        return ContextCompat.getColor(MyApplication.getMyApplicationContext(), colorId);
    }

    /**
     * 添加输入监听
     *
     * @param et      输入框
     * @param watcher 文字监听
     */
    public static void addTextChangedListener(EditText et, TextWatcher watcher) {
        if (Checker.isNull(et)) return;
        et.addTextChangedListener(watcher);
    }

    /**
     * 返回指定的字符串
     *
     * @param strResId 字符串资源编号
     * @return 所求
     */
    public static String getStr(int strResId) {
        return MyApplication.getMyApplicationContext().getString(strResId);
    }

    /**
     * 关闭弹窗
     *
     * @param dialog 弹窗
     */
    public static void dismiss(Dialog dialog) {
        if (Checker.isNull(dialog)) return;
        dialog.dismiss();
    }

    /**
     * 关闭弹窗
     *
     * @param dialog 弹窗
     */
    public static void dismiss(DialogFragment dialog) {
        if (Checker.isNull(dialog)) return;
        dialog.dismiss();
    }

    /**
     * 关闭弹窗
     *
     * @param dialog 弹窗
     */
    public static void dismissAllowingStateLoss(DialogFragment dialog) {
        if (Checker.isNull(dialog)) return;
        if (dialog.isAdded())
            dialog.dismissAllowingStateLoss();
    }

    public static void setCheckBox(CheckBox cb, boolean checked) {
        if (cb != null) cb.setChecked(checked);
    }

    public static void clear(TextView... tvs) {
        for (TextView tv :
                tvs) {
            if (tv != null) tv.setText("");
        }
    }
}
